package org.batallademusica.web.arsenal;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.batallademusica.dominio.Cancion;
import org.batallademusica.dominio.GestorBatallaDeMusica;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.AudioHeader;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.Tag;

import com.movired.utiles.web.mvc.ActionFlow;
import com.movired.utiles.web.mvc.Controller;
import com.movired.utiles.web.mvc.View;

public class ArsenalController extends Controller{
	private static final int CIENMEGAS=100*2^20;
	
	
	public ArsenalController(){
		this.addAction(new begin());
		this.addAction(new nuevaCancion());
	}
	/**
	 * Redirige hacia la pagina de alta de canciones
	 */
	private class begin extends ActionFlow{
		@Override
		public Object perform(HttpServletRequest req, HttpServletResponse resp)
				throws ServletException, IOException {
			new View("arsenal.jsp").go(req,resp);
			return null;
		}
		
	}
	
	/**
	 * Inserta la cancion subida en el sistema. 
	 */
	private class nuevaCancion extends ActionFlow{
		@Override
		public Object perform(HttpServletRequest req, HttpServletResponse resp)
				throws ServletException, IOException {
			// Procesamos los ficheros subidos por upload
			try {
				DiskFileItemFactory repositorioTemporalDisco=new DiskFileItemFactory();
				/**
				 * TODO parametrizar las propiedades del repositorio temporal de canciones. 
				 */
				repositorioTemporalDisco.setSizeThreshold(CIENMEGAS); //100MB
				repositorioTemporalDisco.setRepository(new File("D://temp"));
				List listaFicheros=new ServletFileUpload(repositorioTemporalDisco).parseRequest(req);
				
				for(Iterator it=listaFicheros.iterator();it.hasNext();){
					FileItem campo=(FileItem)it.next();
					if(!campo.isFormField()){
						File fichero=new File("D://temp"+campo.getName());
						campo.write(fichero);
						AudioFile f = AudioFileIO.read(fichero);
						Tag tag = f.getTag();
						AudioHeader audio = f.getAudioHeader();
						Cancion nuevaCancion=new Cancion();
						nuevaCancion.setAnio(tag.getFirst(FieldKey.YEAR).trim());
						nuevaCancion.setAutor(tag.getFirst(FieldKey.ARTIST).trim());
						nuevaCancion.setDisco(tag.getFirst(FieldKey.ALBUM).trim());
						nuevaCancion.setTitulo(tag.getFirst(FieldKey.TITLE).trim());
						nuevaCancion.setBitRate(audio.getBitRateAsNumber());
						nuevaCancion.setCanales(audio.getChannels());
						nuevaCancion.setSegundos(audio.getTrackLength());
						new GestorBatallaDeMusica().nuevaCancion(nuevaCancion);
					}
				}
			} catch (FileUploadException e) {
				// No se ha recibido correctamente los ficheros
				/**
				 * @todo redirigir hacia un error 
				 */
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
			
			return null;
		}
	}
}
